package com.example.zz.example.java.trycatchfinally;

import java.util.ArrayList;
import java.util.List;

/**
 * @author: zhuozhang6
 * @date: 2022/5/11
 * @email: zhuozhang6@iflytek.com
 * <p>
 * Try catch finally return的执行返回顺序
 * https://blog.csdn.net/FlyLikeButterfly/article/details/116920460
 *
 * 逻辑原则：
 * 1、finally一定会执行，不管前面是否return，除非遇到System.exit()、 Runtime.getRuntime().halt(1);
 * 2、一旦有return时，就会生成一个temp临时变量，return的那个值（计算式抽出去，结果值）会被赋值给temp临时变量，过程中有多个return时，后面的值赋给temp覆盖掉前面的值
 * 3、Try catch finally代码执行完成后，如果temp不为空（return过），返回temp
 * 4、注意基础类型和引用类型
 */
public class TryCatchFinallyTest {


    /**
     * @param args
     */
    public static void main(String[] args) {
        System.out.println(test1());//0
        System.out.println(test2());//2
        System.out.println(test3());//10
        System.out.println(test4());//[A, B, C]
        System.out.println(test5());//[c, d]
    }

    public static int test1() {
        int a = 0;
        try {
            return a;//临时temp = 0，等待返回；
        } catch (Exception e) {
            ;
        } finally {
            a = 11;//a变量值改变，跟temp无关；
        }//返回temp；
        return a;//try块已经有返回值，此处不执行；
    }

    public static int test2() {
        int a = 0;
        try {
            int x = 1 / 0;//异常，直接到catch块
            return a;//不执行
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            ;
        }//没有执行return语句；
        return 2;//执行；
    }

    public static int test3() {
        int a = 0;
        try {
            return a;//临时temp = 0；
        } catch (Exception e) {
            e.printStackTrace();
            return 20;//无异常不执行
        } finally {
            return 10;//覆盖临时temp = 10；
        }//返回temp；
    }

    public static List<String> test4() {
        List<String> a = new ArrayList<>();
        try {
            a.add("A");
            a.add("B");
            return a;//临时temp -> List(A,B)
        } catch (Exception e) {
            ;
        } finally {
            a.add("C");//变量a指向的List(A,B)变为List(A,B,C)，即temp指向的List内容变了
            a = null;//变量a重新指向null，temp指向的List无影响；
        }//返回temp
        return a;//不执行
    }

    public static List<String> test5() {
        List<String> b = new ArrayList<>();
        b.add("c");
        b.add("d");

        List<String> a = new ArrayList<>();
        a.add("A");
        a.add("B");
        try {
            return a;//临时temp -> List(A,B)，指向a;
        } catch (Exception e) {
            ;
        } finally {
            return b;//覆盖临时temp -> List(c,d)，重新指向b;
        }//返回temp
    }

}
